Excel VBA中的异常处理

Excel VBA编程时常常出现的错误有输入错误、运行时错误和逻辑错误等几种,针对不同类型的错误,有不同的调试手段。

输入错误的调试

对于输入错误,在模块最开始处添加Option Explicit语句可以解决。该语句对本模块中的所有变量进行类型检查,输入错误的变量会被认为是没有定义的变量。例如,在本示例程序中窗体模块的第一行添加该语句。示例文件的存放路径为Samples\ch12\Excel VBA\输入错误.xlsm。

code.vba
Option Explicit
Private mdblDate1 As Double
Private mdlbDate2 As Double

此时如果在Test过程中把mdblDate1错写成了mdblDat1,即

code.vba
Sub Test()
  mdblDat1 = 0
  mdblData2 = 0
End Sub

则运行程序时会显示图12-1所示的错误提示。

Document Image Document Image

图12-1 错误信息 图12-2 避免运行时错误

运行时错误的调试

运行时错误指的是程序运行过程中出现的错误,可以通过编写容错语句来避免。Excel VBA提供了Err, Error, On Error和Resume等对象和语句来避免发生运行时错误。

下面的程序首先用On Error语句声明,一旦发现错误就转向X标签行,然后用Err对象的Raise方法生成错误。因为生成了错误,跳转到X行,在立即窗口中输出出错信息,执行下一行,Resume Next语句使得从发生错误的下一行继续运行,在立即窗口中输出信息。示例文件的存放路径为Samples\ch12\Excel VBA\运行时错误.xlsm。

code.vba
Sub Test()
    On Error GoTo X
    Err.Raise 1
    Debug.Print "现在重新开始"
    Exit Sub
X:  Debug.Print "Err="; Err.Description
    Resume Next
End Sub

运行过程,在立即窗口中显示运行结果,如图12-2所示。

逻辑错误的调试

发生逻辑错误时,程序不会报错,但是得不到正确的结果。由于得不到错误提示,所以逻辑错误的调试比前面两种的难一些。

对于逻辑错误,使用VB工程中“调试”菜单内的选项可以取得比较好的调试效果。“调试”菜单如图12-3所示。主要的调试手段有定点调试、监视调试和断点调试等几种。作为程序调试的示例程序,在新建模块中添加下列代码。示例文件的存放路径为Samples\ch12\Excel VBA\逻辑错误.xlsm。

code.vba
Function Square(dblA As Double) As Double
  '求给定数的平方
  Square = dblA * dblA
End Function
Sub Sum()
  Dim dblData1 As Double
  Dim dblData2 As Double
  dblData1 = 12
  dblData2 = Square(3)
  Debug.Print dblData1 + dblData2
End Sub

定点调试包括逐语句、逐过程、运行到光标处等方法,是比较常用的。这样可以快速找到可能出问题的代码块,并集中精力进行排查。

Document Image Document Image

图12-3 “调试”菜单 图12-4 “添加监视”对话框

监视调试可以用表达式对选定代码的运行情况进行监视。在“调试”菜单中单击“添加监视…”选项,打开“添加监视”对话框,如图12-4所示。在表达式文本框中输入“dblData2 = 9”,在“监视类型”框架中选择“当监视值为真时中断”单选钮,单击“确定”按钮,显示“监视”窗口,如图12-5所示。运行程序时,当dblData2 = 9时中断运行。

Document Image

图12-5 “监视”窗口

断点调试需要设置断点,当程序运行时,会在断点处停下来。图12-6中,在指定行前面的灰色区域单击,该行设置断点。运行时,会在该行处停下来。此时将鼠标指向变量会显示变量的值,也可以利用立即窗口确定当前指定表达式的值。如图12-6中,在立即窗口中输入“?dblData2”,回车,显示变量dblData2的值9。

Document Image

图12-6 断点调试